package com.itbz.JSP;
/*JSTL标签库与EL表达式的使用
JSTL标签库的使用步骤
添加jstl.jar   注：这里添加jar包要比其它多步骤，多了Artifacts后面的步骤
点击Project Structure-->Libraries-->按 “ + ”——> 选中jstl-1.2.jar-->
点击Artifacts-->在Available Elements 中选中 jstl-1.2.jar 右击选中put into/web -inf/lib
在JSP页面中添加taglib指令标签。

JSTL核心标签的使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>*/


/*什么是JSTL标签库
JSTL（Java server pages standard tag library，即JSP标准标签库）
JSTL标签是基于JSP页面的。这些标签可以插入在JSP代码中，
本质上JSTL也是提前定义好的一组标签，这些标签封装了不同的功能，
在页面上调用标签时，就等于调用了封装起来的功能。JSTL的目标是使JSP页面的
可读性更强、简化JSP页面的设计、实现了代码复用、提高效率。

在JSP2.0版本后开始支持JSTL标签库。在使用JSTL标签库时需要在JSP中添加对应的taglib指令标签。

1<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>*/
public class Jstl00 {
    /*JSTL的核心标签：
1.if：
    语法：<c:if test="" var="" scope=""></c:if>
    当test属性值为true，执行标签体的内容，test属性可以使用EL表达式。
2.choose:
    语法：    <c:choose>
                <c:when test="">    </c:when>
                <c:when test="">    </c:when>
                <c:otherwise>    </c:otherwise>
             </c:choose>
3.forEach:
    语法：
        1.遍历集合：
        <c:forEach var="" items="" carStatus="">
        </c:forEach>
            var:从集合中取出的一个元素。
            items：要遍历的集合。
            varStatus：当前迭代的状态对象，
            getIndex获取下标（从0开始），getCount获取当前迭代次数（从1开始）。
        2.指定位置迭代：
        <c:forEach var="" begin="" end="" step="">
        </c:forEach>
            var：当前迭代的元素。
            begin：开始。
            end:结束。
            step:迭代的步长。
4.url：
    语法：<c:url value="">
    属性：value指定地址，在表单提交，链接当中，可以使用该标签。
    用途：当用户禁止cookie后，会自动在地址后面添加session
          当使用绝对路径时，会自动在地址前添加应用名。
5.set
    语法：<c:set var="" scope="" value="">
    属性：value绑定值。var绑定属性名。scope绑定作用域。
    用途：设置一个对象和属性。
6.remove
    语法：<c:remove var="" scope="">
    用途：解除绑定。
7.catch
    语法：<c:catch var="">
    用途：处理异常，会将异常信息封装成一个对象，绑定到pageContext对象上。
8.import
    语法：<c:import url="">
    属性：url指定一个jsp文件的地址。
    用途：运行时调用一个jsp。
9.redirect：
    语法：<c:redirect url="">
    属性：url指定重定向的地址。
    用途：重定向。
10.out
    语法：<c:out value="" default="" escapeXml="">
    属性：value指定输出的值，
          default指定缺省值，
          escapeXml设置为true，会将value中的特殊字符替换为相应的实体。
    用途：输出EL表达式的值。*/


/*1，表达式控制标签

<c:out>

用于在JSP中显示数据。

语法1：没有本体(body)内容
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />


语法2：有本体内容
<c:out value="value" [escapeXml="{true|false}"]>
default value
</c:out>



<c:set>

用于保存数据。



语法1
将value的值储存至范围为scope的varName变量之中：
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>


语法2
将本体内容的数据储存至范围为scope的varName变量之中：
<c:set var="varName" [scope="{ page|request|session|application }"]>
… 本体内容
</c:set>


语法3
将value的值储存至target对象的属性中：
c:set value="value" target="target" property="propertyName" />


语法4
将本体内容的数据储存至target对象的属性中：
<c:set target="target" property="propertyName">
… 本体内容
</c:set>



<c:remove>

用于删除数据。



语法：
<c:remove var="varName" [scope="{ page|request|session|application }"] />

<c:chtch>



2，流程控制标签

<c:if>

用途跟其他语言中的if类似。



语法1
：没有本体内容(body)
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
varName值为testCondition执行结果（布尔值）。


语法2
：有本体内容
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
本体内容</c:if>
如果表达式的结果为true，则执行本体内容，false则相反



<c:choose>、<c:when>、<c:otherwise>

这3个标签通常情况下是一起使用的，<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。

语法1：
<c:choose>
         <c:when>
         表达式
         <c:otherwise>
         表达式
         <c:otherwise>
         表达式
</c:choose>

语法2：
<c:when text=”条件”>
表达式
</c:when>


语法3：
<c:otherwise>
表达式
</c:otherwise>



补充：

（1）语法1为3个标签的嵌套使用方式，<c:choose>标签只能和<c:when>标签共同使用。
（2）语法2为<c:when>标签的使用方式，该标签都条件进行判断，一般情况下和<c:choose>共同使用。
（3）<c:otherwise>不含有参数，只能跟<c:when>共同使用，并且在嵌套中只允许出现一次。



3，循环标签

<c:forEach>

跟其他语言中的forEach类似。



语法：迭代一集合对象之所有成员
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
</c:forEach>



<c:forTokens>

用于浏览字符串，并根据指定的字符将字符串截取。



语法：
<c:forTokens items=”strigOfTokens” delims=””delimiters [var=”name” begin=”begin” end=”end” step=”len” varStatus=”statusName”] >



4，URL操作标签

<c:import>

该标签可以把其他静态或动态文件包含到本JSP页面。同<jsp:include>的区别为：只能包含同一个web应用中的文件。而<c:import>可以包含其他web应用中的文件，甚至是网络上的资源。



语法1：
<c:import url=”url” [context=”context”][ value=”value”][scope=”page|request|session|application”] [charEncoding=”encoding”]>


语法2：
<c:import url=”url” varReader=”name” [context=”context”][charEncoding=”encoding”]><c:redirect>



<c:url>

该标签用于动态生成一个String类型的URL，可以同<c:redirect>标签共同使用，也可以使用html的<a>标签实现超链接。



语法1：指定一个url不做修改，可以选择把该url存储在JSP不同的范围中。
<c:url value=”value” [var=”name”][scope=”page|request|session|application”][context=”context”]/>


语法2：给url加上指定参数及参数值，可以选择以name存储该url。
<c:url value=”value” [var=”name”][scope=”page|request|session|application”][context=”context”]>
<c:param name=”参数名” value=”值”>
</c:url>



上面说了那么多，那么为什么要用JSTL呢？它有什么优点呢？其优点如下：
1、 简化了JSP和WEB应用程序的开发。
2、 便于维护。
3、 减少甚至避免了JSP中的scriptlet代码。
4、 易于前台人员掌握，使前后台分工明确，提高团队开发效率。*/


/*< c:forEach >
迭代器，用于迭代集合。

属性      	描述
items	    被迭代的集合
begin	    迭代器的起始因子
end	        迭代器的结束因子
step	    迭代因子的增长数
var	        代表当前迭代元素的变量名称
varStatus	代表循环状态的变量名称


varStatus 属性
current: 当前这次迭代的（集合中的）项
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: 用来表明当前这轮迭代是否为第一次迭代的标志
last: 用来表明当前这轮迭代是否为最后一次迭代的标志
begin: 属性值
end: 属性值
step: 属性值*/

}
/*JSTL标签分类
根据JSTL标签所提供的功能，可以将其分为5个类别。

核心标签
最常用、最重要，也是最基本的标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>




格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


SQL标签
JSTL SQL标签库提供了与关系型数据库（Oracle，MySQL，SQL Server等等）进行交互的标签。
XML标签

JSTL XML标签库提供了创建和操作XML文档的标签。
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>


JSTL函数
JSTL包含一系列标准函数，大部分是通用的字符串处理函数。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
*/



/*什么是EL表达式
EL（Expression Language）是一种表达式语言。
是为了使JSP写起来更加简单，减少java代码，
可以使得获取存储在Java对象中的数据变得非常简单。
在JSP2.0版本后开始支持EL表达式。

语法结构
${表达式}

${对象.属性名}

EL表达式中的操作符
操作符	            描述
( )	                优先级
+	                加
-	                减或负
*	                乘
/ 或div	            除
% 或 mod	        取模
== 或 eq	        测试是否相等
!= 或 ne	        测试是否不等
< 或 lt	            测试是否小于
> 或gt	            测试是否大于
<= or le	        测试是否小于等于
>= 或 ge	        测试是否大于等于
&& 或 and	        测试逻辑与
|| 或 or	        测试逻辑或
! 或not	            测试取反
empty	            测试是否空值


EL表达式的隐含对象
隐含对象	                描述
pageScope	        page 作用域
requestScope	    request 作用域
sessionScope	    session 作用域
applicationScope	application 作用域
param	            Request 对象的参数，字符串
paramValues     	Request对象的参数，字符串集合
header	            HTTP 信息头，字符串
headerValues	    HTTP 信息头，字符串集合
initParam	        上下文初始化参数
cookie	            Cookie值
pageContext	        当前页面的pageContext


使用EL表达式取出作用域中的值
${pageScope.name}

${requestScope.name}

${sessionScope.name}

${applicationScope.name}

获取作用域属性中的数据时，也可以只写属性名，
EL表达式会按照pageScope、requestScope、sessionScope、applicationScope的顺序
查找该属性的值。

${name}*/